From 3668504a37652dd6e8fc1d2159365385e2896c3c Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Sun, 11 Dec 2005 00:17:11 +0100 Subject: [PATCH] VMX domain should call domain_crash_synchronous instead of domain_crash. Since domain_crash will return at last, and I watched system crash after its return. Signed-off-by: Xin Li --- xen/arch/x86/shadow_public.c | 21 ++++++++++----------- xen/arch/x86/vmx.c | 14 +++++--------- xen/arch/x86/vmx_vmcs.c | 10 +++++----- 3 files changed, 20 insertions(+), 25 deletions(-) diff --git a/xen/arch/x86/shadow_public.c b/xen/arch/x86/shadow_public.c index 70dd30abcd..ea220edde1 100644 --- a/xen/arch/x86/shadow_public.c +++ b/xen/arch/x86/shadow_public.c @@ -236,26 +236,24 @@ static pagetable_t page_table_convert(struct domain *d) l4_pgentry_t *l4; l3_pgentry_t *l3, *pae_l3; int i; - + l4page = alloc_domheap_page(NULL); if (l4page == NULL) - domain_crash(d); + domain_crash_synchronous(); l4 = map_domain_page(page_to_pfn(l4page)); memset(l4, 0, PAGE_SIZE); l3page = alloc_domheap_page(NULL); if (l3page == NULL) - domain_crash(d); - l3 = map_domain_page(page_to_pfn(l3page)); + domain_crash_synchronous(); + l3 = map_domain_page(page_to_pfn(l3page)); memset(l3, 0, PAGE_SIZE); l4[0] = l4e_from_page(l3page, __PAGE_HYPERVISOR); - pae_l3 = map_domain_page(pagetable_get_pfn(d->arch.phys_table)); - for (i = 0; i < PDP_ENTRIES; i++) { - l3[i] = pae_l3[i]; - l3e_add_flags(l3[i], 0x67); - } + pae_l3 = map_domain_page(pagetable_get_pfn(d->arch.phys_table)); + for (i = 0; i < PDP_ENTRIES; i++) + l3[i] = l3e_from_pfn(l3e_get_pfn(pae_l3[i]), __PAGE_HYPERVISOR); unmap_domain_page(l4); unmap_domain_page(l3); @@ -276,17 +274,18 @@ static void alloc_monitor_pagetable(struct vcpu *v) mmfn_info = alloc_domheap_page(NULL); ASSERT( mmfn_info ); - mmfn = (unsigned long) (mmfn_info - frame_table); + mmfn = page_to_pfn(mmfn_info); mpl4e = (l4_pgentry_t *) map_domain_page(mmfn); memcpy(mpl4e, &idle_pg_table[0], PAGE_SIZE); mpl4e[l4_table_offset(PERDOMAIN_VIRT_START)] = l4e_from_paddr(__pa(d->arch.mm_perdomain_l3), __PAGE_HYPERVISOR); + /* map the phys_to_machine map into the per domain Read-Only MPT space */ phys_table = page_table_convert(d); - mpl4e[l4_table_offset(RO_MPT_VIRT_START)] = l4e_from_paddr(pagetable_get_paddr(phys_table), __PAGE_HYPERVISOR); + v->arch.monitor_table = mk_pagetable(mmfn << PAGE_SHIFT); v->arch.monitor_vtable = (l2_pgentry_t *) mpl4e; } diff --git a/xen/arch/x86/vmx.c b/xen/arch/x86/vmx.c index eb1252ff1c..d0465dbec3 100644 --- a/xen/arch/x86/vmx.c +++ b/xen/arch/x86/vmx.c @@ -196,12 +196,12 @@ static inline int long_mode_do_msr_read(struct cpu_user_regs *regs) case MSR_FS_BASE: if (!(VMX_LONG_GUEST(vc))) /* XXX should it be GP fault */ - domain_crash(vc->domain); + domain_crash_synchronous(); __vmread(GUEST_FS_BASE, &msr_content); break; case MSR_GS_BASE: if (!(VMX_LONG_GUEST(vc))) - domain_crash(vc->domain); + domain_crash_synchronous(); __vmread(GUEST_GS_BASE, &msr_content); break; case MSR_SHADOW_GS_BASE: @@ -265,7 +265,7 @@ static inline int long_mode_do_msr_write(struct cpu_user_regs *regs) case MSR_FS_BASE: case MSR_GS_BASE: if (!(VMX_LONG_GUEST(vc))) - domain_crash(vc->domain); + domain_crash_synchronous(); if (!IS_CANO_ADDRESS(msr_content)){ VMX_DBG_LOG(DBG_LEVEL_1, "Not cano address of msr write\n"); vmx_inject_exception(vc, TRAP_gp_fault, 0); @@ -278,7 +278,7 @@ static inline int long_mode_do_msr_write(struct cpu_user_regs *regs) case MSR_SHADOW_GS_BASE: if (!(VMX_LONG_GUEST(vc))) - domain_crash(vc->domain); + domain_crash_synchronous(); vc->arch.arch_vmx.msr_content.shadow_gs = msr_content; wrmsrl(MSR_SHADOW_GS_BASE, msr_content); break; @@ -1345,12 +1345,8 @@ static int mov_to_cr(int gp, int cr, struct cpu_user_regs *regs) } break; } - case 4: + case 4: /* CR4 */ { - /* CR4 */ - unsigned long old_guest_cr; - - __vmread(GUEST_CR4, &old_guest_cr); if (value & X86_CR4_PAE){ set_bit(VMX_CPU_STATE_PAE_ENABLED, &v->arch.arch_vmx.cpu_state); } else { diff --git a/xen/arch/x86/vmx_vmcs.c b/xen/arch/x86/vmx_vmcs.c index d434724c1b..17eb2caad3 100644 --- a/xen/arch/x86/vmx_vmcs.c +++ b/xen/arch/x86/vmx_vmcs.c @@ -157,13 +157,13 @@ static void vmx_map_io_shared_page(struct domain *d) mpfn = get_mfn_from_pfn(E820_MAP_PAGE >> PAGE_SHIFT); if (mpfn == INVALID_MFN) { printk("Can not find E820 memory map page for VMX domain.\n"); - domain_crash(d); + domain_crash_synchronous(); } p = map_domain_page(mpfn); if (p == NULL) { printk("Can not map E820 memory map page for VMX domain.\n"); - domain_crash(d); + domain_crash_synchronous(); } e820_map_nr = *(p + E820_MAP_NR_OFFSET); @@ -182,7 +182,7 @@ static void vmx_map_io_shared_page(struct domain *d) printk("Can not get io request shared page" " from E820 memory map for VMX domain.\n"); unmap_domain_page(p); - domain_crash(d); + domain_crash_synchronous(); } unmap_domain_page(p); @@ -190,13 +190,13 @@ static void vmx_map_io_shared_page(struct domain *d) mpfn = get_mfn_from_pfn(gpfn); if (mpfn == INVALID_MFN) { printk("Can not find io request shared page for VMX domain.\n"); - domain_crash(d); + domain_crash_synchronous(); } p = map_domain_page(mpfn); if (p == NULL) { printk("Can not map io request shared page for VMX domain.\n"); - domain_crash(d); + domain_crash_synchronous(); } d->arch.vmx_platform.shared_page_va = (unsigned long)p; -- 2.30.2